home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok59.lha / NTSC4NTSC / ntsc4ntsc.mod < prev    next >
Text File  |  1993-08-15  |  9KB  |  270 lines

  1. (* ------------------------------------------------------------------------
  2.   :Program.       NTSC for NTSC
  3.   :Contents.      Get 60 Hz for NTSC screens
  4.   :Author.        Kai Bolay [kai]
  5.   :Address.       Hoffmannstraße 168
  6.   :Address.       D-7250 Leonberg 1
  7.   :History.       v1.0 [kai] 15-Aug-91 (started written history)
  8.   :History.       v1.1 [kai] 16-Aug-91 (bug fixes)
  9.   :History.       v1.2 [kai] 26-Sep-91 (+ improved stdHeight-handling)
  10.   :Copyright.     Public Domain
  11.   :Language.      Oberon
  12.   :Translator.    AMIGA OBERON v2.09e, A+L AG
  13.   :Remark.        Thanks to Peter Cherna
  14.   :Usage.         NTSC4NTSC STDPAL/S,STDNTSC/S,USEAUTO/S
  15.   :Usage.         The first to Options describe behaviour for StdHeight-
  16.   :Usage.         Screens. The last says use AutoScroll instead of PAL
  17. ------------------------------------------------------------------------ *)
  18. MODULE NTSC4NTSC;
  19.  
  20. IMPORT
  21.   e: Exec, I: Intuition, g: Graphics, u: Utility, d: Dos, s: SYSTEM
  22.   (* $IF DoIt *) ,dio: DebugIo (* $END *);
  23.  
  24. CONST
  25.   OpenScreenOfs = -198;
  26.   OpenScreenTagsOfs = -612;
  27.   Version = "$VER: NTSC4NTSC v1.2 (26-Sep-91) by Kai Bolay\r\n";
  28.   Template = "STDPAL/S,STDNTSC/S,USEAUTO/S";
  29.   ntscMonitorSet = s.VAL (LONGSET, g.ntscMonitorID);
  30.   palMonitorSet = s.VAL (LONGSET, g.palMonitorID);
  31. TYPE
  32.   ExtNewScreenPtr = POINTER TO I.ExtNewScreen;
  33.   OpenScreenProc = PROCEDURE (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  34.   OpenScreenTagsProc = PROCEDURE (newScreen{8}: I.NewScreenPtr;
  35.                                   tagList{9}: u.TagItemPtr): I.ScreenPtr;
  36. VAR
  37.   OldOpenScreen: OpenScreenProc;
  38.   OldOpenScreenTags: OpenScreenTagsProc;
  39.   OldNormRows: INTEGER;
  40.   OScanRect: g.Rectangle;
  41.   Opt: ARRAY 3 OF LONGINT;
  42.   RD: d.RDArgsPtr;
  43.   StdHeightMonitorSet: LONGSET;
  44.  
  45. (* $Debug- *)
  46. (* $StackChk- $SaveRegs+ Prepare to work in other tasks *)
  47. PROCEDURE NewOpenScreenTags* (newScreen{8}: I.NewScreenPtr;
  48.                               tagList{9}: u.TagItemPtr): I.ScreenPtr;
  49. CONST
  50.   Mask = LONGSET {0, 2, 5, 6, 7, 10, 11, 12, 15, 16, 17, 18};
  51.   ES = I.EasyStruct (s.SIZE (I.EasyStruct), LONGSET {}, s.ADR ("NTSC4NTSC"),
  52.   s.ADR ("Which Mode should be used for the\nscreen named '%s'?"),
  53.   s.ADR ("NTSC|PAL"));
  54. VAR
  55.   Base: I.IntuitionBasePtr;
  56.   TState, Tag, DisplayTag, TypeTag: u.TagItemPtr;
  57.   Tags: ARRAY 2 OF u.TagItem;
  58.   DisplayID: LONGINT;
  59.   DisplaySet: LONGSET;
  60.   OScanRect: g.Rectangle;
  61.   Height: INTEGER;
  62.   Title: e.STRPTR;
  63.  
  64. BEGIN
  65.   Base := s.REG (14);
  66.  
  67.   (* $IF DoIt *)
  68.   dio.WriteString ("\nHi Folks!\n");
  69.   (* $END *)
  70.  
  71.   Height := I.stdScreenHeight; DisplayTag := NIL; DisplayID := 0;
  72.   Title := s.ADR ("");
  73.  
  74.   IF newScreen # NIL THEN
  75.     Height := newScreen.height;
  76.     Title := newScreen.defaultTitle;
  77.     DisplayID := I.UIntToLong (s.VAL (INTEGER, newScreen.viewModes));
  78.     (* $IF DoIt *)
  79.     dio.WriteString ("NewScreen gibbet:\n");
  80.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  81.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  82.     (* $END *)
  83.   END; (* IF *)
  84.  
  85.   IF tagList # NIL THEN
  86.     TState := tagList;
  87.     LOOP
  88.       Tag := u.NextTagItem (TState);
  89.       IF Tag = NIL THEN EXIT END;
  90.       CASE Tag.tag OF
  91.       | I.saDisplayID: DisplayTag := Tag; DisplayID := Tag.data;
  92.       | I.saType:      TypeTag := Tag;
  93.       | I.saHeight:    Height := SHORT (Tag.data);
  94.       | I.saTitle:     Title := Tag.data;
  95.       ELSE
  96.       END;
  97.     END;
  98.     (* $IF DoIt *)
  99.     dio.WriteString ("TagList gibbet:\n");
  100.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  101.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  102.     (* $END *)
  103.   END;
  104.  
  105.   DisplaySet := s.VAL (LONGSET, DisplayID) * Mask;
  106.   (* $IF DoIt *)
  107.   dio.WriteString ("The DisplayID: "); dio.WriteHex (s.VAL (LONGINT, DisplaySet), 8); dio.WriteLn;
  108.   (* $END *)
  109.  
  110.   IF (palMonitorSet * DisplaySet # palMonitorSet) AND
  111.      (ntscMonitorSet * DisplaySet # ntscMonitorSet) AND
  112.      (I.QueryOverscan (s.VAL (LONGINT, ntscMonitorSet + DisplaySet),
  113.                        OScanRect, I.oScanText) # 0) THEN
  114.     (* $IF DoIt *)
  115.     dio.WriteString ("Let's patch: ");
  116.     (* $END *)
  117.     IF Height = I.stdScreenHeight THEN
  118.       (* $IF DoIt *)
  119.       dio.WriteString ("Std-Height\n");
  120.       (* $END *)
  121.       IF StdHeightMonitorSet = LONGSET {} THEN
  122.         IF I.EasyRequest (NIL, s.ADR (ES), NIL, Title) = 1 THEN
  123.           DisplayID := s.VAL (LONGINT, ntscMonitorSet + DisplaySet);
  124.         ELSE
  125.           DisplayID := s.VAL (LONGINT, palMonitorSet + DisplaySet);
  126.         END;
  127.       ELSE
  128.         DisplayID := s.VAL (LONGINT, StdHeightMonitorSet + DisplaySet);
  129.       END;
  130.     ELSE
  131.       IF (Height <= OScanRect.maxY - OScanRect.minY + 1) AND
  132.          ((Height # -1) OR (Opt[0] = 0)) THEN
  133.         (* $IF DoIt *)
  134.         dio.WriteString ("NTSC\n");
  135.         (* $END *)
  136.         DisplayID := s.VAL (LONGINT, ntscMonitorSet + DisplaySet);
  137.       ELSE
  138.         IF (Opt[2] = 0) OR ((TypeTag = NIL) AND (newScreen = NIL)) THEN
  139.           (* $IF DoIt *)
  140.           dio.WriteString ("PAL\n");
  141.           (* $END *)
  142.           DisplayID := s.VAL (LONGINT, palMonitorSet + DisplaySet);
  143.         ELSE
  144.           DisplayID := s.VAL (LONGINT, ntscMonitorSet + DisplaySet);
  145.           IF newScreen # NIL THEN
  146.             INCL (newScreen.type, I.autoScroll);
  147.           END;
  148.           IF TypeTag # NIL THEN
  149.             TypeTag.data := s.VAL (LONGINT, s.VAL (LONGSET, TypeTag.data) +
  150.                                             LONGSET {I.autoScroll});
  151.           END;
  152.         END;
  153.       END;
  154.     END;
  155.   END;
  156.  
  157.   IF DisplayTag # NIL THEN
  158.     (* $IF DoIt *)
  159.     dio.WriteString ("ab in den Tag!\n");
  160.     (* $END *)
  161.     DisplayTag.data := DisplayID;
  162.   ELSE
  163.     (* $IF DoIt *)
  164.     dio.WriteString ("neue List: ");
  165.     (* $END *)
  166.     Tags[0].tag := I.saDisplayID;
  167.     Tags[0].data := DisplayID;
  168.     IF tagList = NIL THEN
  169.       (* $IF DoIt *)
  170.       dio.WriteString ("alone\n");
  171.       (* $END *)
  172.       Tags[1].tag := u.done;
  173.     ELSE
  174.       (* $IF DoIt *)
  175.       dio.WriteString ("more\n");
  176.       (* $END *)
  177.       Tags[1].tag := u.more;
  178.       Tags[1].data := tagList;
  179.     END;
  180.     tagList := s.ADR (Tags);
  181.   END;
  182.  
  183.   s.SETREG (14, Base);
  184.   RETURN OldOpenScreenTags (newScreen, tagList);
  185. END NewOpenScreenTags;
  186.  
  187. (* $StackChk- $SaveRegs+ Prepare to work in other tasks *)
  188. PROCEDURE NewOpenScreen* (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  189. VAR
  190.   Base: I.IntuitionBasePtr;
  191. BEGIN
  192.   Base := s.REG (14);
  193.   (* Do the magic *)
  194.   IF (I.nsExtended IN newScreen.ns.type) THEN
  195.     EXCL (newScreen.ns.type, I.nsExtended);
  196.     s.SETREG (14, Base);
  197.     RETURN NewOpenScreenTags (newScreen, newScreen.extension);
  198.   ELSE
  199.     s.SETREG (14, Base);
  200.     RETURN NewOpenScreenTags (newScreen, NIL);
  201.   END;
  202. END NewOpenScreen;
  203. (* $Debug= *)
  204.  
  205. BEGIN
  206.   (* $IF DoIt *)
  207.   dio.OpenIo;
  208.   dio.WriteString ("Jappadappaduuu!\n");
  209.   (* $END *)
  210.   (* $IF SmallData *)
  211.   s.SETREG (0, d.Write (d.Output (), "No SmallData please!\n", 21));
  212.   (* $ELSE *)
  213.   s.SETREG (0, d.Write (d.Output (), Version[6], s.SIZE (Version)-6));
  214.   (* 2.04 should be :-) *)
  215.   IF I.int.libNode.version < 37 THEN
  216.     IF d.Output () # NIL THEN
  217.       s.SETREG (0, d.Write (d.Output (), "Sorry, I need OS 2.04!\n", 23));
  218.     END;
  219.     HALT (20);
  220.   END;
  221.  
  222.   (* NTSC & PAL available? *)
  223.   IF (g.FindDisplayInfo (g.palMonitorID) = NIL) OR
  224.      (g.FindDisplayInfo (g.ntscMonitorID) = NIL) THEN
  225.     s.SETREG (0, d.PutStr ("Sorry, PAL & NTSC must be available!\n"));
  226.     HALT (20);
  227.   END;
  228.  
  229.   Opt[0] := 0; Opt[1] := 0; Opt[2] := 0;
  230.   RD := d.ReadArgs (Template, Opt, NIL);
  231.   IF RD # NIL THEN d.FreeArgs (RD); RD := NIL END;
  232.   IF Opt[0] # 0 THEN StdHeightMonitorSet := palMonitorSet END;
  233.   IF Opt[1] # 0 THEN StdHeightMonitorSet := ntscMonitorSet END;
  234.  
  235.   (* Patch *)
  236.   e.Forbid;
  237.   OldOpenScreen := s.VAL (OpenScreenProc,
  238.                           e.SetFunction (I.int, OpenScreenOfs,
  239.                                          s.VAL (e.PROC, NewOpenScreen)));
  240.   OldOpenScreenTags := s.VAL (OpenScreenTagsProc,
  241.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  242.                                              s.VAL (e.PROC, NewOpenScreenTags)));
  243.   e.Permit;
  244.  
  245.   (* Wait for Break *)
  246.   s.SETREG (0, e.Wait (LONGSET {d.ctrlC})); (* ... *)
  247.  
  248.   (* Unpatch *)
  249.   e.Forbid;
  250.   OldOpenScreen := s.VAL (OpenScreenProc,
  251.                           e.SetFunction (I.int, OpenScreenOfs,
  252.                                          s.VAL (e.PROC, OldOpenScreen)));
  253.   OldOpenScreenTags := s.VAL (OpenScreenTagsProc,
  254.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  255.                                              s.VAL (e.PROC, OldOpenScreenTags)));
  256.   e.Permit;
  257.   IF (s.VAL (e.PROC, OldOpenScreen) # s.VAL (e.PROC, NewOpenScreen)) OR
  258.      (s.VAL (e.PROC, OldOpenScreenTags) # s.VAL (e.PROC, NewOpenScreenTags)) THEN
  259.     IF I.DisplayAlert (I.recoveryAlert,
  260.                        "\x00\x10\x10Someone else patched too. Safety cannot be guarateed, please reboot!\o\n\x00\x10\x1A     -> Reboot <-                           -> Hope and pray <-     \o\o",
  261.                        40) THEN
  262.       e.ColdReboot;
  263.     END;
  264.   END;
  265.   (* $END *)
  266.   (* $IF DoIt *)
  267.   dio.CloseIo;
  268.   (* $END *)
  269. END NTSC4NTSC.
  270.